#include "Ventana.h"
#include "../modelo/UnidadLogica.h"
#include "../constantes.h"

Ventana::Ventana(double x, double y, double ancho, double alto, Canvas* canvas,
		list<pair<string, string> >* listaParesElementos){
	this->ancho = ancho;
	this->alto = alto;
	this->x = x;
	this->y = y;
	this->canvas = canvas;
	this->listaParesElementos = listaParesElementos;
	this->elementoSeleccionado = NULL;
	this->window = NULL;
	this->scrollbar = NULL;
	this->menu = NULL;
	this->renderer = NULL;
}

Ventana::~Ventana() {

	delete (canvas);
	delete (menu);
	delete (scrollbar);
	SDL_DestroyWindow(window);
	SDL_Quit();

}

void Ventana::renderizarObjetos() {
	SDL_RenderPresent(this->renderer);
}

bool Ventana::inicializar() {

	window = SDL_CreateWindow("IncredibleFiuba!", this->x, this->y,
			this->ancho, this->alto,SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
	if (window == NULL) {
		std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
		return false;
	}
	renderer = SDL_CreateRenderer(window, -1,
			SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
	if (renderer == NULL) {
		std::cout << "SDL_CreateRenderer Error: " << SDL_GetError()
				<< std::endl;
		return 1;
	}

	menu = new Menu();
	scrollbar = new Scrollbar(this->listaParesElementos);
	return true;

}

bool Ventana::inicializarServer() {
	window = SDL_CreateWindow("IncredibleFiuba!",  this->x, this->y,
			this->ancho, this->alto,SDL_WINDOW_HIDDEN);
	if (window == NULL) {
		std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
		return false;
	}
	renderer = SDL_CreateRenderer(window, -1,
			SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
	if (renderer == NULL) {
		std::cout << "SDL_CreateRenderer Error: " << SDL_GetError()
				<< std::endl;
		return 1;
	}

	menu = new Menu();
	scrollbar = new Scrollbar(this->listaParesElementos);
	return true;
}

Scrollbar* Ventana::getScrollbar() {

	return this->scrollbar;
}

Canvas* Ventana::getCanvas() {

	return this->canvas;
}

Menu* Ventana::getMenu() {

	return this->menu;
}

void Ventana::dibujar(double x, double y, double largo, double ancho,
		SDL_Renderer* renderer, AreaOtorgada* area) {

	SDL_Surface* windowSurface = SDL_GetWindowSurface(window);
	int anchoPantalla = windowSurface->w;
	int altoPantalla = windowSurface->w * PROPORCION_ALTO_ANCHO_PANTALLA;

	// Resizeo proporcional
	SDL_SetWindowSize(window, anchoPantalla, altoPantalla);

	this->ancho = anchoPantalla;
	this->alto = altoPantalla;

	double anchoCanvas = PROPORCION_CANVAS_ANCHO * anchoPantalla;
	double altoCanvas = PROPORCION_CANVAS_ALTO * altoPantalla;

	double anchoMenu = anchoPantalla;
	double altoMenu = (1 - PROPORCION_CANVAS_ALTO) * altoPantalla + 10;

	double anchoScrollbar = (1 - PROPORCION_CANVAS_ANCHO) * anchoPantalla + 10;
	double altoScrollbar = altoCanvas;

	double anchoUL = anchoCanvas / (canvas->cantUnidadesLogicasAncho);
	double altoUL = altoCanvas / (canvas->cantUnidadesLogicasAlto);

	UnidadLogica* instancia = UnidadLogica::obtenerInstancia();
	instancia->setAnchoUl(anchoUL);
	instancia->setAltoUl(altoUL);

	if (menu->isClickCambiarFondo()) {
		canvas->cambiarFondo(renderer, menu->getFondoSeleccionado());
	}

	canvas->dibujar(renderer, 0, 0, anchoCanvas, altoCanvas,area);

	recalcularObjetosMenu(0, altoCanvas, anchoMenu, altoMenu);
	menu->dibujar(renderer, 0, altoCanvas, anchoMenu, altoMenu);
	menu->getCajaTexto()->dibujarTexto(renderer);

	recalcularObjetosScrollbar(anchoScrollbar, 0, anchoScrollbar,
			altoScrollbar);
	scrollbar->dibujar(renderer, anchoCanvas, 0, anchoScrollbar, altoScrollbar);
	this->dibujarElementoSeleccionado();
	this->renderizarObjetos();

}

SDL_Renderer * Ventana::getRenderer() {
	return this->renderer;
}

void Ventana::recalcularObjetosScrollbar(double x, double y, double w,
		double h) {

	double anchoCanvas = PROPORCION_CANVAS_ANCHO * this->ancho;

// Recalculo las posiciones de las flechas
	scrollbar->xFlechaAbajo = anchoCanvas + x * PROPORCION_FLECHAS_X;
	scrollbar->xFlechaArriba = anchoCanvas + x * PROPORCION_FLECHAS_X;
	scrollbar->yFlechaAbajo = h * PROPORCION_FLECHA_ABAJO_Y;
	scrollbar->yFlechaArriba = h * PROPORCION_FLECHA_ARRIBA_Y;
	scrollbar->anchoFlechas = w * PROPORCION_FLECHA_ANCHO;
	scrollbar->altoFlechas = h * PROPORCION_FLECHA_ALTO;

// Recalculo las posiciones de los objetos del scrollbar
	scrollbar->xElementos = anchoCanvas + x * PROPORCION_FIGURAS_X;
	scrollbar->anchoElementos = w * PROPORCION_FIGURAS_ANCHO;
	scrollbar->altoElementos = h * PROPORCION_FIGURAS_ALTO;

	scrollbar->getPosicionesYElementos()->at(0) = h
			* PROPORCION_PRIMERA_FIGURA_Y;
	scrollbar->getPosicionesYElementos()->at(1) = h
			* PROPORCION_SEGUNDA_FIGURA_Y;
	scrollbar->getPosicionesYElementos()->at(2) = h
			* PROPORCION_TERCERA_FIGURA_Y;
	scrollbar->getPosicionesYElementos()->at(3) =
			h * PROPORCION_CUARTA_FIGURA_Y;
	scrollbar->getPosicionesYElementos()->at(4) =
			h * PROPORCION_QUINTA_FIGURA_Y;

}

void Ventana::recalcularObjetosMenu(double x, double y, double w, double h) {

	double altoCanvas = PROPORCION_CANVAS_ALTO * this->alto;

	double anchoBotones = PROPORCION_ANCHO_BOTONES * w;
	double altoBotones = PROPORCION_ALTO_BOTONES * h;
	double posicionYBotones = PROPORCION_BOTONES_Y * h + altoCanvas;
	double posicionXBotonAceptar = PROPORCION_BOTON_ACEPTAR_X * w;
	double posicionXBotonGuardar = PROPORCION_BOTON_GUARDAR_X * w;
	double posicionXBotonSalir = PROPORCION_BOTON_SALIR_X * w;

	// Seteo la nueva posicion de cada boton
	menu->getVectorBotones()->at(0)->setAncho(anchoBotones);
	menu->getVectorBotones()->at(0)->setAlto(altoBotones);
	menu->getVectorBotones()->at(0)->setX(posicionXBotonAceptar);
	menu->getVectorBotones()->at(0)->setY(posicionYBotones);

	menu->getVectorBotones()->at(1)->setAncho(anchoBotones);
	menu->getVectorBotones()->at(1)->setAlto(altoBotones);
	menu->getVectorBotones()->at(1)->setX(posicionXBotonGuardar);
	menu->getVectorBotones()->at(1)->setY(posicionYBotones);

	menu->getVectorBotones()->at(2)->setAncho(anchoBotones);
	menu->getVectorBotones()->at(2)->setAlto(altoBotones);
	menu->getVectorBotones()->at(2)->setX(posicionXBotonSalir);
	menu->getVectorBotones()->at(2)->setY(posicionYBotones);

	// Seteo las nuevas dimensiones del textbox
	menu->getCajaTexto()->setX(PROPORCION_TEXTBOX_X * w);
	menu->getCajaTexto()->setY(PROPORCION_TEXTBOX_Y * h + altoCanvas);
	menu->getCajaTexto()->setAncho(PROPORCION_TEXTBOX_ANCHO * w);
	menu->getCajaTexto()->setAlto(PROPORCION_TEXTBOX_ALTO * h);

	// Seteo las nuevas dimensiones del tilde
	menu->xTilde = PROPORCION_TILDE_X * w;
	menu->yTilde = PROPORCION_TILDE_Y * h + altoCanvas;
	menu->anchoTilde = PROPORCION_TILDE_ANCHO * w;
	menu->altoTilde = PROPORCION_TILDE_ALTO * h;

	menu->xPlayStop = PROPORCION_PLAYSTOP_X * w;
	menu->yPlayStop = PROPORCION_PLAYSTOP_Y * h + altoCanvas;
	menu->anchoPlayStop = PROPORCION_PLAYSTOP_ANCHO * w;
	menu->altoPlayStop = PROPORCION_PLAYSTOP_ALTO * h;

}

void Ventana::desplazarObjetosScrollbar(int flecha) {

// Si presiono la flecha de arriba del scrollbar
	if (flecha == 0) {
		if (scrollbar->getLimiteInf() > 0) {
			cout << "Presiono el boton de arriba " << endl;
			scrollbar->setLimiteInf(scrollbar->getLimiteInf() - 1);
			scrollbar->setLimiteSup(scrollbar->getLimiteSup() - 1);
		}
	} else {
		cout << "Presiono el boton de abajo " << endl;
		if ((unsigned int) scrollbar->getLimiteSup()
				< scrollbar->getListaElementosDisponibles()->size() - 1) {
			scrollbar->setLimiteInf(scrollbar->getLimiteInf() + 1);
			scrollbar->setLimiteSup(scrollbar->getLimiteSup() + 1);
		}
	}

}

void Ventana::agregarElementoSeleccionado(Elemento* elem) {
	this->elementoSeleccionado = elem;
}

void Ventana::eliminarElementoSeleccionado() {
	this->elementoSeleccionado = NULL;
}

void Ventana::dibujarElementoSeleccionado() {
	if (this->elementoSeleccionado == NULL)
		return;
	elementoSeleccionado->dibujar(elementoSeleccionado->getX(),
			elementoSeleccionado->getY(), elementoSeleccionado->getAncho(),
			elementoSeleccionado->getAlto(), renderer);

}

void Ventana::setCanvas(Canvas* can) {
	this->canvas = can;
}
